/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.sgsmcan.Controlador;

import com.sgsmcan.Dao.ModuloDao;
import com.sgsmcan.Dao.ModuloDaoImpl;
import com.sgsmcan.Dao.PaginationDao;
import com.sgsmcan.Dao.PerfilDao;
import com.sgsmcan.Dao.PerfilDaoImpl;
import com.sgsmcan.Dao.PermisoDao;
import com.sgsmcan.Dao.PermisoDaoImpl;
import com.sgsmcan.Entidad.Modulo;
import com.sgsmcan.Entidad.Perfil;
import com.sgsmcan.Entidad.Permiso;
import com.sgsmcan.Utils.Utilitario;
import java.io.Serializable;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import javax.faces.application.NavigationHandler;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

/**
 *
 * @author user
 */
@ManagedBean(name = "rolBean")
@ViewScoped
public class RolControlador implements Serializable {

    private List<Modulo> modulos;
    private List<Permiso> permisos;
    private LazyDataModel<Perfil> roles;
    private PaginationDao daoPaginacion;
    private PerfilDao daoRol;
    private ModuloDao daoModulo;
    private PermisoDao daoPermiso;
    private Perfil rol;
    private Perfil auxiliar = null;
    @ManagedProperty("#{usuarioBean}")
    private UsuarioControlador usuarioSesion;

    public RolControlador() {
        daoPaginacion = new PaginationDao();
        daoRol = new PerfilDaoImpl();
        rol = new Perfil();
    }

    public void initLista() {
        usuarioSesion.generarModulo(2);
        roles = new LazyDataModel<Perfil>() {
            @Override
            public List<Perfil> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
                int totalRows = daoPaginacion.getTotalRows(daoRol.getRols());
                roles.setRowCount(totalRows);
                List<Perfil> roles = daoPaginacion.getList(daoRol.getRols(), first, pageSize);
                return roles;
            }
        };
    }

    public void initInsercion() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            daoModulo = new ModuloDaoImpl();
            modulos = daoModulo.getModulos();
            instanciarPermisos(modulos);
        }

    }

    public void initUpdate() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            Object parametro = FacesContext.getCurrentInstance().getExternalContext().getFlash().get("idPerfil");
            if (parametro == null) {
                FacesContext fc = FacesContext.getCurrentInstance();
                NavigationHandler nh = fc.getApplication().getNavigationHandler();
                nh.handleNavigation(fc, null, "/views/rols/list.xhtml?faces-redirect=true");
            }
            Integer id = (Integer) parametro;
            rol = daoRol.getPerfilPorID(id);
            auxiliar = rol;
            daoModulo = new ModuloDaoImpl();
            modulos = daoModulo.getModulos();
            daoPermiso = new PermisoDaoImpl();
            permisos = daoPermiso.getPermisosPorPerfil(id);
            cargarPermisos(modulos);
        }
    }

    public String irUpdate(int id) {
        FacesContext.getCurrentInstance().getExternalContext().getFlash().put("idPerfil", id);
        return "perfilUpdate";
    }

    private void instanciarPermisos(List<Modulo> modulos) {
        for (int i = 0; i < modulos.size(); i++) {
            modulos.get(i).setPermiso(new Permiso());
        }
    }

    private void cargarPermisos(List<Modulo> modulos) {
        for (int i = 0; i < modulos.size(); i++) {
            for (Permiso permiso : permisos) {
                if (permiso.getModulo().getId().equals(modulos.get(i).getId())) {
                    modulos.get(i).setPermiso(permiso);
                    break;
                }
            }
            if (modulos.get(i).getPermiso() == null) {
                modulos.get(i).setPermiso(new Permiso());
            }
        }
    }

    public void insertarPerfil(ActionEvent event) {
        if (!esValido()) {
            return;
        }
        try {
            for (Modulo modulo : modulos) {
                Permiso permiso = modulo.getPermiso();
                permiso.setPerfil(rol);
                permiso.setModulo(modulo);
                rol.getPermisos().add(permiso);
            }
            daoRol.insertar(rol);
        } catch (Exception e) {
            Utilitario.enviarMensajeGlobalError("Error del sistema");
            e.printStackTrace();
            return;
        }
        Utilitario.enviarMensajeGlobalValido("Se ha ingresado correctamente");
    }
    
    public void actualizarPerfil(ActionEvent evnt){
        if (!esValido()) {
            return;
        }
        rol.setPermisos(new HashSet<Permiso>(0));
        try {
            for (Modulo modulo : modulos) {
                Permiso permiso = modulo.getPermiso();
                permiso.setPerfil(rol);
                permiso.setModulo(modulo);
                rol.getPermisos().add(permiso);
            }
            
            daoRol.actualizar(rol);
        } catch (Exception e) {
            Utilitario.enviarMensajeGlobalError("Error del sistema");
            e.printStackTrace();
            return;
        }
        Utilitario.enviarMensajeGlobalValido("Se ha actualizado correctamente");
    }

    private boolean esValido() {
        if (!esPerfilValido()) {
            return false;
        }
        return true;
    }

    private boolean esPerfilValido() {
        rol.setNombre(rol.getNombre() == null ? rol.getNombre() : rol.getNombre().trim());
        if (Utilitario.esNulo(rol.getNombre())) {
            Utilitario.enviarMensajeGlobalError("Debe ingresar el perfil");
            return false;
        }else if (!Utilitario.esRangoValido(rol.getNombre(), 120)) {
            Utilitario.enviarMensajeGlobalError("El maximo de caracteres del usuario es 120");
            return false;
        }
        try{
            if (auxiliar == null) {
                if(daoRol.existePerfil(rol.getNombre())){
                    Utilitario.enviarMensajeGlobalError("Ya existe ese perfil");
                    return false;
                }    
            }else{
                if(!rol.getNombre().equalsIgnoreCase(auxiliar.getNombre()) && daoRol.existePerfil(rol.getNombre()))
                {
                    Utilitario.enviarMensajeGlobalError("Ya existe ese perfil");
                    return false;
                }

            }
        }catch(Exception e){
            Utilitario.enviarMensajeGlobalError("Error en el sistema");
            e.printStackTrace();
            return false;
        }
        return true;
    }


    /*GETTER AND SETTER*/
    public LazyDataModel<Perfil> getRoles() {
        return roles;
    }

    public void setRoles(LazyDataModel<Perfil> roles) {
        this.roles = roles;
    }

    public List<Modulo> getModulos() {
        return modulos;
    }

    public void setModulos(List<Modulo> modulos) {
        this.modulos = modulos;
    }

    public Perfil getRol() {
        return rol;
    }

    public void setRol(Perfil rol) {
        this.rol = rol;
    }

    public void setUsuarioSesion(UsuarioControlador usuarioSesion) {
        this.usuarioSesion = usuarioSesion;
    }
    
    
}
